package org.zxp.thread.tools;

import java.util.concurrent.Semaphore;

/**
 * @program: zxp-thread-test
 * @description: Semaphore测试
 * @author: X-Pacific zhang
 * @create: 2019-05-25 14:59
 **/
public class SemaphoreTest {
    static Semaphore semaphore = new Semaphore(3);//只能通过3个信号

    public static void main(String[] args){
        for (int i = 0; i < 5; i++) {//开启5个线程，非公平3个线程能同时执行service方法，其他2线程阻塞，知道前面线程执行完成
            new Thread(() -> {
                new SemaphoreTest().service();
            },(i+1)+"号线程").start();
        }

//不支持重入
//        Semaphore semaphore = new Semaphore(1);//只能通过3个信号
//        for (int i = 0; i < 1; i++) {//开启5个线程
//            new Thread(() -> {
//                new SemaphoreTest().service();
//                new SemaphoreTest().service();
//            },(i+1)+"号线程").start();
//        }
    }

    public void service(){
        before();//动态代理添加 最大只能同时开启3个semaphore.acquire();（除非semaphore.release();）
        try{
            try {
                Thread.sleep(3000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"执行完成");
        }finally {
            after();//动态代理添加 必须释放 释放后才能进入新的线程
        }
    }

    public void before() {
        try {
            semaphore.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void after() {
        semaphore.release();
    }



}
